#ifndef __GAME_MANAGER_H__
#define __GAME_MANAGER_H__

#include "snake.h"
#include "game_map.h"
#include "touch.h"
#include "lcd.h"
#include "ai_snake.h"
#include "music.h"
#include "page_manager.h"
#include "showfont.h"
#include "main_page.h"
#include "game_page.h"
#include "popup.h"
#include <thread>
#include <mutex>

class GamePage;
class MenuPopup;
class LevelPopup;
class MainPage;

// 游戏管理器
class GameManager
{

    GameManager() : snake(nullptr), game_map(nullptr), touch(nullptr), lcd(nullptr),
                    ai_snake(nullptr), showFont(nullptr), pageManager(nullptr),
                    gamePage(nullptr), menuPopup(nullptr), levelPopup(nullptr)
    {
        init();
        speed = 8;
        level = 0;
        score = 0;
        max_speed = 10;
        min_speed = 10;
        is_create_ai_snake = false;
        is_running = false;
        is_game_over = true; // 游戏开始时处于游戏结束状态
    }

public:
    ~GameManager();

    void init();               // 初始化：创建所有模块实例、初始化数据
    void start();              // 开始游戏
    void gameInit(int _level); // 设置难度
    void create_ai_snake();    // 创建AI蛇
    void destroy_ai_snake();   // 销毁AI蛇
    void showMenuPopup();      // 显示菜单弹窗
    void showLevelPopup();     // 显示难度弹窗
    void showMainPage();       // 显示主页面
    void stopGame();           // 停止游戏
    void reloadGame();         // 继续游戏
    void backPage();           // 返回上一页
    void mainReloadGame();     // 主页面继续游戏

    // 静态线程包装函数（线程入口）
    static void touchThreadWrapper(GameManager *manager);
    static void gameThreadWrapper(GameManager *manager);
    static void musicThreadWrapper(GameManager *manager);
    void touchTask(); // 触摸线程
    void gameTask();  // 游戏线程
    void musicTask(); // 音乐线程

    BasePage *getCurrPage();

    int getScore() { return score; }
    int getLevel() { return level; }
    int getSpeed() { return speed; }

    // 创建和删除实例
    static GameManager *instance();
    static void delInstance();

private:
    static GameManager *m_instance; /* 单例实例对象空间指针 */

    // 模块实例指针
    Snake *snake = nullptr;
    GameMap *game_map = nullptr;
    Touch *touch = nullptr;
    Lcd *lcd = nullptr;
    AISnake *ai_snake = nullptr;
    ShowFont *showFont = nullptr;
    PageManager *pageManager = nullptr;
    GamePage *gamePage = nullptr;
    MenuPopup *menuPopup = nullptr;
    LevelPopup *levelPopup = nullptr;
    MainPage *mainPage = nullptr;
    Music *music = nullptr;

    BasePage *prevPage = nullptr;

    // 游戏状态
    bool is_running;         // 运行/暂停  true: 运行 false: 暂停
    bool is_game_over;       // 游戏结束
    bool is_create_ai_snake; // 是否创建AI蛇
    int score;               // 得分
    int level;               // 难度等级
    int speed;               // 速度  单位0.1s
    int max_speed;           // 最大速度
    int min_speed;           // 最小速度
};

#endif